package com.example.mq.common;

import java.io.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ws
 * Date: 2023-10-02
 * Time: 14:22
 */
/*
 * 标准库的序列化方法要求其他的类实现 Serializable 接口
 * 第三方的库不需要
 */
public class BinaryTool {
    /*
     * 把一个对象序列化成一个字节数组
     */
    public static byte[] toBytes(Object object) throws IOException {
        // 相当一个变长数组
        // 把 object 序列化的数据存入 byteArrayOutputStream ，再统一转成 byte[]
        // try() 是为了让它们自动 close
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                // 此处的 writeObject 就会把该对象进行序列化，生成的二进制字节数据，就会写入到 ObjectOutputStream
                // 由于 ObjectOutputStream 又关联了 ByteArrayOutputStream，最终的结果就会写入到这个变长的字节数组
                objectOutputStream.writeObject(object);
            }
            // 将变长数组中的二进制数据转换成 byte[]
            return byteArrayOutputStream.toByteArray();
        }
    }

    /*
     * 把一个字节数组反序列化成一个对象
     */
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)){
                // 此处的 readObject，就是从 data 这个 byte[] 中读取数据进行反序列化
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}

